package com.gking.processHarvest.utils;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gking.processHarvest.common.BaseContext;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.gking.processHarvest.common.CustomException;


/**
 * 查看用户某一条数据的状态以及重命名
 *
 * @param <T>
 */

public class CheckStatus<T> {

    /**
     * 检查数据库中的实体类的某一行数据是否存在且是否删除了
     *
     * @param targetId        想要查询的目标实体的ID。
     * @param getIdFunc       用于从实体中获取ID的函数。
     * @param getMasterIdFunc 用于从实体中获取主ID的函数
     * @param getIsDeleteFunc 用于从实体中获取删除标记的函数。
     * @return 一个配置好的查询包装器。
     */
    public LambdaQueryWrapper<T> checkIsDelete(String targetId,
                                               SFunction<T, ?> getIdFunc,
                                               SFunction<T, ?> getMasterIdFunc,
                                               SFunction<T, ?> getIsDeleteFunc) {

        if (targetId == null || getIdFunc == null || getMasterIdFunc == null || getIsDeleteFunc == null) {
            throw new CustomException("No argument can be null.");
        }

        LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(getIdFunc, targetId);
        queryWrapper.eq(getMasterIdFunc, BaseContext.getCurrentId());
        queryWrapper.eq(getIsDeleteFunc, 0);
        return queryWrapper;
    }


    /**
     * 检查数据库中的实体类的是否存在已有名称，也就是重复命名检查
     *
     * @param targetName      想要查询的目标实体类中的名称。
     * @param getNameFunc     用于从实体中获取名称的函数。
     * @param getMasterIdFunc 用于从实体中获取主ID的函数
     * @param getIsDeleteFunc 用于从实体中获取删除标记的函数。
     * @return 一个配置好的查询包装器。
     */
    public LambdaQueryWrapper<T> checkDuplicateName(String targetName,
                                                    SFunction<T, ?> getNameFunc,
                                                    SFunction<T, ?> getMasterIdFunc,
                                                    SFunction<T, ?> getIsDeleteFunc) {

        if (targetName == null || getNameFunc == null || getMasterIdFunc == null || getIsDeleteFunc == null) {
            throw new CustomException("No argument can be null.");
        }

        LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(getNameFunc, targetName);
        queryWrapper.eq(getMasterIdFunc, BaseContext.getCurrentId());
        queryWrapper.eq(getIsDeleteFunc, 0);
        return queryWrapper;
    }
}
